package tools

import (
	"bytes"
	"encoding/gob"
)

// 定义RPC交互的数据结构
type RPCData struct {
	// 访问的函数
	Name string
	// 访问时的参数
	Args []interface{}
}

// 编码
func Encode(data RPCData) ([]byte, error) {
	//buf为bytes.Buffer结构，这个结构实际上就是一个拥有Read和Write方法的可变长度字节缓冲区，即bytes.Buffer既是读取器也是写入器
	var buf = new(bytes.Buffer)
	//将缓冲区数据传递给NewEncoder函数，以此来创建出一个gob编码器
	encoder := gob.NewEncoder(buf)
	//调用编码器的Encode函数，将数据data写入到buf中
	err := encoder.Encode(data)
	if err != nil {
		return nil, err
	}
	return buf.Bytes(), nil
}

// 解码
func Decode(b []byte) (RPCData, error) {
	//根据数据b创建缓冲区buffer，借此为数据b提供相应的Read方法和Write方法
	var buf = bytes.NewBuffer(b)
	//调用NewDecoder函数，为缓冲区创建相应的解码器
	decoder := gob.NewDecoder(buf)
	var data RPCData
	//调用解码器读取原始数据，并存入到data中
	err := decoder.Decode(&data)
	if err != nil {
		return data, err
	}
	return data, nil
}
